首先,來聽首歌吧
這首歌的原唱是 Sam Smith,但我覺得這個版本實在太好聽了所以分享給大家~
本文章範例跟文字許多引述自 Rails Guide,想參觀的可以看這裡
先來說說為什麼需要驗證?
因為我們並不想要資料庫裡面存一些沒有用的資料,必須要限定這些資料至少符合特定的標準才允許寫進資料庫
在 Rails 中驗證是寫在 model level,如果沒有通過驗證就完全不會碰到資料庫
new_record?
用來確定這筆資料是不是已經寫入資料庫
我們也可以用 valid?
invalid
這兩種方法看這個實體是否有效 (在未被寫入之前)
p = Person.new
p.valid?
#=> false
如果用的是 create 或者 update 在 SQL 裡使用的是 INSERT
方法,如果是用 update
則是 UPDATE
方法
存入資料庫的方法有下面幾種
create
create!
save
save!
update
update!
這些驚嘆號方法會導致寫入失敗的話跳出 exception,如果不捕捉的話頁面會壞掉,非驚嘆號版本則不會
在這方法後面我們可以用 validate: false
使他繞過驗證,這通常是用在開發的時候,使用時須小心
save(validate: false)
我們在資料無法存入的時候,可以使用 errors.messages
看無法存入的原因
class Person < ApplicationRecord
validates :name, presence: true
end
p = Person.create
p.errors.messages
# => {name:["can't be blank"]}
Rails 已經寫好一些常用的驗證方法給我們使用,在這些 helpers 後面我們都可以再加上 :on
跟 :message
這兩種屬性,決定他們要用在哪裡,還有存取失敗的時候會存進怎樣的訊息到 errors 中
這種驗證最常用在看完條款,要打勾的那種時候,如果不打勾無法繼續往下
class Person < ApplicationRecord
validates :terms_of_service, acceptance: true
end
在 model 之間互有關聯的時候,有時候會需要確定兩邊都有存入資料才算成功,這時候可以使用這個驗證
class Library < ApplicationRecord
has_many :books
validates_associated :books
end
要注意不能兩邊的 model 都寫,不然會進入無窮迴圈
這個驗證通常用在需要重複輸入信箱或密碼的時候,驗證你第二次輸入的內容是不是符合一開始的內容
class Person < ApplicationRecord
validates :email, confirmation: true
end
接著我們就可以在 view 的頁面這樣寫
<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>
exclusion 用在限制不讓使用者寫進特定資料
class Account < ApplicationRecord
validates :subdomain, exclusion: { in: %w(www us ca jp)}
end
in
這個屬性裡面放陣列,陣列裡面的就是不讓使用者寫進去的資料
format 用在限制資料的格式,這通常會搭配常規表示法使用
class Product < ApplicationRecord
validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/}
end
除了 with
這個屬性,我們還可以使用 without
inclusion 是剛剛 exclusion 的相法,如果內容不包含特定的字就無法寫入
class Coffee < ApplicationRecord
validates :size, inclusion: { in: %w(small medium large)}
end
相關的 helpers 還很多,明天會陸續介紹喔!今天就先介紹到這邊~
參考資料:
本文章同步分享於 http://anthonychao.site/